﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Day03
{
    partial class Program
    {
        static void Main1(string[] args)
        {
            Hand hand = new Hand()
            {
                AllObject = new List<IThrowable>()
                {
                    new Grenade(),
                    new Dart()
                }
            };
            hand.Throwing();
        }
        //显示实现接口，解决多接口实现时的二义性，即多个接口的方法名相同造成的二义性
        //另一个作用：解决接口中的成员对实现类不适用的问题
        static void Main2(string[] args)
        {
            //显示实现接口作用1：解决多接口实现时的二义性
            Test03 t1 = new Test03();
            //t1.Fun1();//不能调用显示实现接口的Fun1方法
            Interface01 f1 = new Test03();
            f1.Fun1();
            Interface04 f4 = new Test03();
            f4.Fun1();

            //显示实现接口作用2：解决接口中的成员对实现类不适用的问题
            Test02 t2 = new Test02();
            t2.Fun1();
            t2.Fun2();
            //t2.Fun3();//不能调用显示实现接口的Fun3方法
        }
        //应用-排序-简单的面向接口编程
        static void Main3(string[] args)
        {
            int[] arr = { 6,2,9};
            Array.Sort(arr);
            Grenade[] grenadeArray = 
            {
                new Grenade(){ ATK = 86,AttackDistance = 2},
                new Grenade(){ ATK = 100,AttackDistance = 1},
                new Grenade(){ ATK = 50,AttackDistance = 3}
            };
            //默认调用的是IComparable接口的CompareTo方法
            Array.Sort(grenadeArray);
            //需求变化：偶尔还想使用攻击距离作为排序依据；调用的是IComparer接口的Compare方法
            Array.Sort(grenadeArray,new GrenadeComparer());
            //推断类型
            var grenade = new Grenade() { ATK = 86, AttackDistance = 2 };
            grenade.Fly();//实例方法
        }
        //应用-迭代
        static void Main(string[] args)
        {
            int[] arr = { 6, 2, 9 };
            Array.Sort(arr);
            Grenade[] grenadeArray =
            {
                new Grenade(){ ATK = 86,AttackDistance = 2},
                new Grenade(){ ATK = 100,AttackDistance = 1},
                new Grenade(){ ATK = 50,AttackDistance = 3}
            };
            //可以被迭代的条件
            //实现IEnumerable接口，具有GetEnumerable方法
            foreach (var item in grenadeArray)
            {
                Console.WriteLine("Grenade:"+ item);
            }

            Hand hand = new Hand()
            {
                AllObject = new List<IThrowable>()
                {
                    new Grenade(),
                    new Dart()
                }
            };
            foreach (var item in hand)//hand不包含IEnumerable接口
            {
                Console.WriteLine(item);
            }
            //模拟foreach内部代码：包含在foreach中
            //1.获取迭代器对象
            IEnumerator iterator =  hand.GetEnumerator();
            //2.移动下一个元素
            while (iterator.MoveNext())
            {//有元素
            //3.获取当前元素
                object element = iterator.Current;
                //Console.WriteLine(element);
                //...
            }
            //可以使用一种方式读取类中集合类型成员
        }
    }
}
